/**
 *  1. 基础路径配置和超时时间
 * 
 *  2. 请求拦截器
 *     2-1. 请求头中 携带token
 *     2-2. 开启loading效果 NProgress
 * 
 *  3. 响应拦截器
 *     3-1. 简化服务器响应的数据
 *     3-2. 关闭loading效果
 *     3-3. 根据响应状态码是不是401.进行鉴权
 *     3-4. 统一错误处理
 * 
 */
import axios from 'axios'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

import {getToken, getUser, removeToken,removeUser} from '../utils/storageUtils'
//1. 创建一个实例,配置基础路径及超时时间
const request = axios.create({
    baseURL:'http://localhost:9999',
    timeout:20000
})

//2. 请求拦截
request.interceptors.request.use(config=>{
    // 1. 获取token
    let token = getToken()
    // 2. 如果有token，那么自动在headers中发送给服务器
    if(token){
        config.headers.token = token
    }
    // 3. 开启loading
    NProgress.start();
    return config;
})

// 3. 响应拦截器
request.interceptors.response.use(response=>{
    // 关闭loading状态
    NProgress.done();
    return response.data; // 简化服务器数据
}, error=>{
    // 判断响应状态是否是401
    if(error.response.status === 401){// token权限异常
        // 本地存储中删除有问题的token和user
        removeToken()
        removeUser()
        console.log('token权限异常');
        // 重新登录
        location.href = '/login.html'
    }else{
        console.log('请求出问题了');
    }
    // 关闭loading状态
    NProgress.done();
    return new Promise(()=>{})
})

// 导入二次封装好的request
export default request;

